package com.anquing.securitydemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 1.WebSecurityConfigurerAdapter
 * WebSecurityConfigurerAdapter是HttpSecurity核心适配器，认证及权限拦截规则都在这里配置，配置类需要添加@EnableWebSecurity注解
 *
 * 2.@PreAuthorize
 * @PreAuthorize注解可实现在方法上添加权限限制，配置类需要添加@EnableGlobalMethodSecurity(prePostEnabled = true)注解
 * 使用方法参考MessageServiceImpl、WithMockUserTests
 *
 *3.自定义认证过滤器，实现多种登录方式（手机号+验证码登录？）
 * 方式1（难度大，但稳定）：模拟UsernamePasswordAuthenticationFilter写一个filter
 * 主要有三个类：
 * UsernamePasswordAuthenticationFilter  过滤器
 * UsernamePasswordAuthenticationToken   生成token
 * DaoAuthenticationProvider   验证密码、用户状态等，例子中实现了AuthenticationProvider，ProviderManager就是根据该类的supports方法来选择provider
 * loadUserByUsername 支持用户名或手机号查询用户信息
 * AbstractAuthenticationFilterConfigurer(SecurityConfigurerAdapter) 参考该类，完成filter的初始化：this.authFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class));
 * 认证成功后，AbstractAuthenticationProcessingFilter会将AuthenticationToken保存到SecurityContext中
 * 测试路径：http://localhost:8089/loginByPhone?phone=1&code=123456
 *
 * 方式2（部分逻辑要自己写）：使用以下代码实现
 * 使用方法参考TestingAuthenticationFilter
 * SecurityContext context = SecurityContextHolder.createEmptyContext();
 * Authentication authentication =
 *     new TestingAuthenticationToken("username", "password", "ROLE_USER");
 * context.setAuthentication(authentication);
 * SecurityContextHolder.setContext(context);
 */


@SpringBootApplication
public class SecurityDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(SecurityDemoApplication.class, args);
	}

}
